\section{Aspetti progettuali}
In questa sezione discuteremo delle scelte progettuali fatte per realizzare l'applicazione del gioco in Java, utilizzando RMI come meccanismo di comunicazione tra gli host, ovvero i giocatori. L'algoritmo per lo svolgimento delle partite e della gestione dei crash \`e completamente distribuito equamente tra i giocatori e l'unica forma di centralizzazione presente \`e il server di registrazione. 

\subsection{Stato condiviso}
Per poter giocare la partita, ogni giocatore mantiene le informazioni di tutti i partecipanti al gioco in una lista contenente le seguenti informazioni:
\begin{itemize}
\item \textbf{identificativo}: contenente informazioni come indirizzo IP e nome del giocatore;
\item \textbf{stato attuale}: alive o crashed;
\item \textbf{numero di penalit\`a attuali}: 0-5, se superiore a 5 si tratta di un giocatore eliminato.
\end{itemize}
Questa lista viene creata dal server al momento della registrazione al gioco e viene comunicata a tutti i giocatori. I giocatori vengono inseriti secondo l'ordine in cui si sono registrati alla partita e l'indice numerico che li indentifica nella lista rappresenta il turno di gioco assegnatogli e di conseguenza l'ordine rispetto agli altri giocatori.
Inoltre, ciascuno mantiene l'informazione su quale giocatore ha attualmente il turno, cio\`e su chi ha i dadi in mano in quel momento.\\

Queste informazioni vengono aggiornate durante lo svolgimento della partita. Ogni volta che avviene una modifica, viene comunicato l'aggiornamento della singola informazione a tutti i giocatori che provvedono a modificare la loro copia dello stato condiviso.

\subsection{Topologia della rete e comunicazioni}

Date le informazioni viste in precedenza ogni giocatore \`e a conoscenza di tutte le informazioni necessarie a connettersi a ciascuno degli altri giocatori e pu\`o comunicare con ciascuno di essi. Infatti per le comunicazioni di notifica di un cambiamento di stato, l'informazione viene comunicata dal giocatore che modifica lo stato a tutti gli altri con un broadcast. \\

Gli stati vengono modificati in base alle regole del gioco, durante lo svolgimento della partita, queste modifiche possono essere:
\begin{itemize}
\item assegnazione di una penalit\`a a un giocatore;
\item passaggio del turno ad un altro giocatore;
\item cambiamento dello stato di un giocatore a ``crashed''.
\end{itemize}

In quest'ultimo caso a notificare il crash di un giocatore \`e quello precedente ad esso, in quanto ogni giocatore controlla costantemente se il successivo \`e ancora vivo, creando una rete ad anello unidirezionale. Nel caso si accorga del crash lo comunica a tutti gli altri giocatori e passa a controllare il successivo ancora vivo.\\

Oltre alle comunicazioni generali di notifica di stato, per giocare la partita i giocatori si passano i dadi in una comunicazione one-to-one. Il giocatore che ha il turno tira i dadi e passa al successivo il valore dichiarato e il reale punteggio ottenuto, nascosto. Il giocatore che riceve i dadi potr\`a vedere inizialmente solo il punteggio dichiarato. Se decide di dubitare il punteggio reale verr\`a svelato e  sar\`a calcolata la penalit\`a da assegnare.\\

Messaggi testuali vengono mandati a tutti i giocatori esclusi dalla comunicazione one-to-one in corso in quel momento, per mantenerli informati su cosa sta accadendo nel frattempo, nonostante queste informazioni non siano necessarie per il corretto svolgimento del gioco (lo ``storico dei tiri'' non \`e rilevante, il gioco non ha memoria dei tiri) ma siano piuttosto significative per rendere il giocatore maggiormente partecipe.

\subsection{Gestione dei crash}

Durante lo svolgimento ordinario del gioco, cio\`e in assenza di crash, il leader \`e il giocatore di turno, che tira i dadi o dubita, determinando chi sar\`a il prossimo giocatore di turno. Come gi\`a detto in precedenza la rilevazione dei crash avviene tramite una rete ad anello in cui ciascuno controlla il giocatore successivo. Se un giocatore si accorge di un crash automaticamente diventa il leader del gioco, ovvero si occupa di gestire il turno nel caso in cui il giocatore crashato detenesse il turno di gioco, e lo assegna al primo giocatore vivo successivo a quello crashato. 

\subsection{Termine del Gioco}

Nel corso della partita pu\`o verificarsi che diversi giocatori crashino o escano dal gioco per aver raggiunto il massimo delle penalit\`a. Il gioco quindi pu\`o terminare quando rimane un unico giocatore vivo e che non ha raggiunto il massimo delle penalit\`a. Questo sar\`a il vincitore del gioco. Pu\`o anche accadere che non ci sia nessun giocatore vincitore nel caso in cui tutti i giocatori crashino e l'ultimo rimasto vivo abbia superato il massimo delle penalit\`a.

